<?php
/**
 * Created by PhpStorm.
 * User: 40323
 * Date: 2017-09-12
 * Time: 14:29
 */

namespace app\index\controller;
use app\index\model\Book;
use app\index\model\Profile;
use app\index\model\Role;
use app\index\model\User as UserModel;
use think\log;
use think\Controller;

class User extends Controller
{
    // 获取用户列表并输出
    public function index()
    {
        $list = UserModel::all();
        $this->assign('list',$list);
        $this->assign('count',count($list));
        trace('这是测试调试信息');
        trace(UserModel::all());
        return $this->fetch();

    }

    // 获取用户数据列表，并分页
    public  function index2()
    {
        $list = UserModel::paginate(2);
        $this->assign('list',$list);
        return $this->fetch();
    }

    // 获取用户数据列表 public
    public  function index3()
    {
        $list = UserModel::paginate(2);
        $this->assign('list',$list);
        $this->view->replace([
            '__PUBLIC__'    =>  '/static',
        ]);
        return $this->fetch();
    }

    // 获取用户数据列表 display
    public  function index4()
    {
        $list = UserModel::all();
        $this->assign('list', $list);
        $this->assign('count', count($list));
        // 关闭布局
        $this->view->engine->layout(false);
        $content = <<<EOT
<style>            
body{
	color: #333;
	font: 16px Verdana, "Helvetica Neue", helvetica, Arial, 'Microsoft YaHei', sans-serif;
	margin: 0px;
	padding: 20px;
}

a{
	color: #868686;
	cursor: pointer;
}
a:hover{
	text-decoration: underline;
}
h2{
	color: #4288ce;
	font-weight: 400;
	padding: 6px 0;
	margin: 6px 0 0;
	font-size: 28px;
	border-bottom: 1px solid #eee;
}
div{
margin:8px;
}
.info{
	padding: 12px 0;
	border-bottom: 1px solid #eee;
}

.copyright{
	margin-top: 24px;
	padding: 12px 0;
  border-top: 1px solid #eee;
}
</style>
<h2>用户列表（{\$count}）</h2>
<div>
{volist name="list" id="user"  }
ID：{\$user.id}<br/>
昵称：{\$user.nickname}<br/>
邮箱：{\$user.email}<br/>
生日：{\$user.birthday}<br/>
------------------------<br/>
{/volist}
</div>
<div class="copyright">
	<a title="官方网站" href="http://www.thinkphp.cn">ThinkPHP</a> 
	<span>V5</span> 
	<span>{ 十年磨一剑-为API开发设计的高性能框架 }</span>
</div>

EOT;
        return $this->display($content);
    }

    // 获取用户数据列表
    public  function index5($id)
    {
        $user = UserModel::get($id);
        return view('', ['user' => $user], ['__PUBLIC__'    => '/static']);
    }

    // 断点测试
    public function index6($id)
    {
        dump('测试');
        trace(['a', 'b', 'c']);
        halt(UserModel::get($id));
        return 'hello,'.$_GET['name'];exit;
    }

    public function logext()
    {
//        Log::error('错误信息');
//        Log::info('日志信息');
//        trace('错误信息','error');
//        trace('日志信息','info');
    }


    // 新增用户数据 方式1
    public function add()
    {
        $user = new UserModel;
        $user->nickname = '流年';
        $user->email = 'thinkphp@qq.com';
        $user->birthday = strtotime('1977-03-05');
        if ($user->save()) {
            return '用户[' . $user->nickname . ':' . $user->id . ']新增成功';
        } else {
            return $user->getError();
        }
    }

    // 新增用户数据 方式2
    public function add2()
    {
        $user['nickname'] = '看云';
        $user['email'] = 'kancloud@qq.com';
        $user['birthday'] = strtotime('2015-04-02');
        if ($result = UserModel::create($user)) {
            return '用户[ ' . $result->nickname . ':' . $result->id . ' ]新增成功';
        } else {
            return '新增出错';
        }
    }




    // 批量新增用户数据
    public  function addList()
    {
        $user = new UserModel;
        $list = [
            ['nickname' => '张三', 'email' => 'zhanghsan@qq.com', 'birthday' => strtotime('1988-01-15')],
            ['nickname' => '李四', 'email' => 'lisi@qq.com', 'birthday' => strtotime('1990-09-19')],
        ];
        if($user->saveAll($list)){
            return '用户批量新增成功';
        }else{
            return $user->getError();
        }
    }

    /**
     * 读取用户数据
     * 说明：链式方式读取
     * @param string $id
     */
    public function read($id='')
    {
        $user = UserModel::get($id);
        echo $user->nickname . '<br/>';
        echo $user->email . '<br/>';
        echo date('Y/m/d', $user->birthday) . '<br/>';
    }

    /**
     * 读取用户数据2
     * 说明：通过数组方式读取
     * @param string $id
     */
    public function read2($id = '')
    {
        $user = UserModel::get($id);
        echo $user['nickname'] . '<br/>';
        echo $user['email'] . '<br/>';
        echo date('Y/m/d', $user['birthday']) . '<br/>';
    }

    /**
     * 读取用户数据3
     * 说明：通过 getByField 读取
     */
    public function read3()
    {
        $user = UserModel::getByEmail('thinkphp@qq.com');
        echo $user['nickname'] . '<br/>';
        echo $user['email'] . '<br/>';
        echo date('Y/m/d', $user['birthday']) . '<br/>';
    }

    /**
     * 读取用户数据4
     * 说明：通过 UserModel::get[array]
     */
    public function read4()
    {
        $user = UserModel::get(['nickname'=>'流年']);
        echo $user['nickname'] . '<br/>';
        echo $user['email'] . '<br/>';
        echo date('Y/m/d', $user['birthday']) . '<br/>';
    }

    /**
     * 读取用户数据5
     * 说明：通过 UserModel::get[function]
     */
    public function read5()
    {
        $user = UserModel::get(function ($query){
            $query->where('nickname','流年')->where('id','<',10)->order('id','desc');
        });
        echo $user['nickname'] . '<br/>';
        echo $user['email'] . '<br/>';
        echo date('Y/m/d', $user['birthday']) . '<br/>';
    }

    /**
     * 数据列表1
     * UserModel::all
     */
    public function lists()
    {
        $list = UserModel::all();
        foreach ($list as $user){
            echo $user['nickname'] . '<br/>';
            echo $user['email'] . '<br/>';
            echo date('Y/m/d', $user['birthday']) . '<br/>';
            echo '--------------------------';
        }
    }

    /**
     * 数据列表2
     * UserModel::all(array)
     */
    public function lists2()
    {
        $list = UserModel::all(['status'=>0]);
        foreach ($list as $user){
            echo $user['nickname'] . '<br/>';
            echo $user['email'] . '<br/>';
            echo date('Y/m/d', $user['birthday']) . '<br/>';
            echo '--------------------------';
        }
    }


    /**
     * 数据列表3
     * UserModel::all(funciton)
     */
    public function lists3()
    {
        $list = UserModel::all(function($query){
            $query->where('id','<',3)->order('id','desc');
        });
        foreach ($list as $user){
            echo $user['nickname'] . '<br/>';
            echo $user['email'] . '<br/>';
            echo date('Y/m/d', $user['birthday']) . '<br/>';
            echo '--------------------------';
        }
    }


    /**
     * 更新用户数据1
     * 方法：UserModel::get  链式操作
     */
    public function update($id)
    {
        $user = UserModel::get($id);
        $user->nickname = '刘晨';
        $user->email    = 'liu21st@gmail.com';
        $user->save();
        return '更新用户成功';
    }

    /**
     * 更新用户数据2 - 其实是新增
     * 方法：isUpdate(false) 是新增，true 是修改
     */
    public function update2()
    {
        $user = new UserModel;
        $user->nickname = '刘晨2';
        $user->email    = 'liu21st@gmail.com';
        // 强制进行数据新增操作
        $user->isUpdate(false)->save();
        return '更新用户成功';
    }

    /**
     * 更新用户数据3
     * 方法：UserModel::update  数组形式
     */
    public function update3($id)
    {
        $user['id'] = (int)$id;
        $user['nickname'] = '刘晨';
        $user['email']    = 'liu21st@gmail.com';
        UserModel::update($user);
        return '更新用户成功';
    }

    /**
     * 删除用户数据1
     * 说明：delete
     * @param $id
     * @return string
     */
    public function delete($id)
    {
        $user = UserModel::get($id);
        if($user){
            $user->delete();
            return '删除用户成功';
        }else{
            return '删除用户失败';
        }
    }

    /**
     * 删除方式2
     * 说明：destroy
     * @param $id
     * @return string
     */
    public  function delete2($id)
    {
        $user = UserModel::destroy($id);
        if($user){
            return '删除用户成功';
        }else{
            return '删除用户失败';
        }
    }





    /**
     * 新增用户数据 采用读取器 注意：brithday
     * Model 修改器
     * @return array|string
     */
    public function addAttr()
    {
        $user = new UserModel;
        $user->nickname = '流年';
        $user->email = 'thinkphp@qq.com';
        $user->birthday = '1977-03-05';
        if ($user->save()) {
            return '用户[' . $user->nickname . ':' . $user->id . ']新增成功';
        } else {
            return $user->getError();
        }
    }


    /**
     * 用 Model 的读取器 注意：brithday
     * @param string $id
     */
    public function readAttr($id='')
    {
        $user = UserModel::get($id);
        echo $user->nickname . '<br/>';
        echo $user->email . '<br/>';
        echo $user->user_birthday . '<br/>';
    }


    // 类型转换
    public function type($id='')
    {
        $user = UserModel::get($id);
        echo $user->nickname . '<br/>';
        echo $user->email . '<br/>';
        echo $user->birthday . '<br/>';
    }






    // ====================================== 一对一关联 hasOne - belongsTo /start ======================================

    /**
     * 关联写入
     * 方式1
     *  user 和 profile 关联 .hasOne 关联
     * @return array|string
     */
    public function add3(){
        $user = new UserModel;
        $user->name     = 'thinkphp';
        $user->password = '123456';
        $user->nickname = '流年';
        if($user->save()){
            // 写入关联数据
            $profile = new Profile;
            $profile->truename = '刘晨';
            $profile->birthday = '1977-03-05';
            $profile->address  = '中国上海';
            $profile->email    = 'thinkphp@qq.com';
            $user->profile()->save($profile);
            return '用户新增成功';
        }else{
            return $user->getError();
        }
    }

    /**
     * 关联写入
     * 方式2:注意和上边的区别，链式和profile数组
     *  user 和 profile 关联 .hasOne 关联
     * @return array|string
     */
    public function add4(){
        $user = new UserModel;
        $user->name     = 'thinkphp';
        $user->password = '123456';
        $user->nickname = '流年';
        if($user->save()){
            // 写入关联数据
            $profile['truename'] = '刘晨';
            $profile['birthday'] = '1977-03-05';
            $profile['address']  = '中国上海';
            $profile['email']    = 'thinkphp@qq.com';;
            $user->profile()->save($profile);
            return '用户[ ' . $user->name . ' ]新增成功';
        }else{
            return $user->getError();
        }
    }

    // 关联查询
    public function read6($id)
    {
        $user = UserModel::get($id);
        echo $user->name."<br/>";
        echo $user->nickname."<br/>";
        echo $user->profile->truename."<br/>";
        echo $user->profile->email."<br/>";
    }


    // 关联更新
    public function update4($id)
    {
        $user = UserModel::get($id);
        $user->name = 'framework';
        if($user->save()){
            // 关联师尊数据
            $user->profile->email = 'liu21st@gmail.com';
            $user->profile->save();
            return '用户[ ' . $user->name . ' ]更新成功';
        }else{
            return $user->getError();
        }
    }

    // 关联删除
    public  function delete3($id)
    {
        $user = UserModel::get($id);
        if($user->delete()){
            // 删除关联数据
            $user->profile->delete();
            return '用户[ ' . $user->name . ' ]删除成功';
        }else{
            return $user->getError();
        }
    }

    // ====================================== 一对一关联 hasOne - belongsTo/end ======================================


    // ====================================== 一对多关联 hasMany - belongsTo /start ======================================


    // 填加一本书
    public  function addBook($id)
    {
        $user               = UserModel::get($id);
        $book               = new Book;
        $book->title        = 'ThinkPHP5快速入门';
        $book->publish_time = '2016-05-06';
        $user->books()->save($book);
        return '添加Book成功';

    }

    // 批量填加数据
    public function addBooks($id)
    {
        $user = UserModel::get($id);
        $books = [
            ['title' => 'ThinkPHP5快速入门', 'publish_time' => '2016-05-06'],
            ['title' => 'ThinkPHP5开发手册', 'publish_time' => '2016-03-06'],
        ];
        $user->books()->saveAll($books);
        return '添加成功';
    }

    // 关联查询
    public function read7($id)
    {
        $user = UserModel::get($id);
        $books = $user->books();
        dump($books);
    }

    // 一对多查询同样可以使用预载入查询 with
    public function read8()
    {
        $user  = UserModel::get(2,'books');
        $books = $user->books();
        dump($books);
    }

    // 关联数据来查询当前模型数据
    public function read9()
    {
        // 查询有写过书的作者列表
        $user = UserModel::has('books')->select();
        // 查询写过三本书以上的作者
        $user = UserModel::has('books','>=',3)->select();
        // 查询写过ThinkPHP5快速入门的作者
        $user = UserModel::has('books',['title'=>'ThinkPHP5快速入门'])->select();
    }


    //关联更新
    public function update5($id)
    {
        $user = UserModel::get($id);
        $book = $user->books()->getByTitle('ThinkPHP5开发手册');
        $book->title = 'ThinkPHP5快速入门';
        $book->save();
    }

    // 使用查询构建器的update方法进行更新（但可能无法触发关联模型的事件）
    public function update6($id)
    {
        $user = UserModel::get($id);
        $user->books()->where('title', 'ThinkPHP5快速入门')->update(['title' => 'ThinkPHP5开发手册']);
    }

    // 关联删除
    public function delete4($id)
    {
        $user = UserModel::get($id);
        // 删除部分关联数据
        $book = $user->books()->getByTitle('ThinkPHP5开发手册');
        $book->delete();
    }

    // 删除所有的关联数据：
    public  function delete5($id){
        $user = UserModel::get($id);
        if($user->delete()){
            $user->books()->delete();
        }
    }

    public function testtest($id)
    {

    }

    // ====================================== 一对一关联 hasMany - belongsTo /end ======================================


    // ====================================== 多对多关联 /start ======================================

    /**
     * 场景
     * 一个用户会有多个角色，同时一个角色也会包含多个用户，这就是一个典型的多对多关联，
     * 先创建一个角色表think_role
     * 多对多关联通常一定会有一个中间表，也称为枢纽表 think_access
     */

    // 给某个用户增加编辑角色，并且由于这个角色还没创建过
    public function add5($id)
    {
        $user = UserModel::get($id);
        $user->roles()->save(['name' => 'editor', 'title' => '编辑']);
        return '用户角色新增成功';
    }


    // 批量新增用户的角色
    public function add6($id)
    {
        $user = UserModel::get($id);
        $user->roles()->saveAll([
            ['name' => 'leader', 'title' => '领导'],
            ['name' => 'admin', 'title' => '管理员'],
        ]);
        return '用户角色新增成功';
    }

    // 现在给另外一个用户增加编辑角色，由于该角色已经存在了，
    // 所以只需要使用attach方法增加枢纽表的关联数据：
    public function add7()
    {
        $user = UserModel::getByNickname('张三');
        $role = Role::getByName('editor');
        // 添加枢纽表数据
        $user->roles()->attach($role);
        return '用户角色新增成功';
    }

    // 直接使用角色Id添加关联数据
    // 关联新增数据
    public function add8()
    {
        $user = UserModel::getByNickname('张三');
        $user->roles()->attach(1);  // 说明：1是为role的主键，即：id
        return '用户角色新增成功';
    }

    // 关联删除
    public function delete6($id)
    {
        $user = UserModel::get($id);
        $role = Role::getByName('editor');
        // 删除关联数据 并同时删除关联模型数据
        $user->roles()->detach($role,true);
        return '用户角色删除成功';
    }

    // 关联查询
    // 获取用户流年的所有角色的话，直接使用：
    public function read10($id)
    {
        $user = UserModel::get($id);
        dump($user->roles);
    }

    // ====================================== 多对多关联 /end ======================================


    // ====================================== 模型输出 /start ======================================

    // 得到
    public function read11($id = '')
    {
        $user = UserModel::get($id);
        return view('read11',['user'=>$user]);
    }

    // 模型数据列表
    public function list4()
    {
        $list = UserModel::all();
        return view('list',['list'=>$list]);
    }
    // ====================================== 模型输出 /end ======================================

    // 输出数组 toArray
    public function read12($id = '')
    {
        $user = UserModel::get($id);
        dump($user->toArray());
    }

    // 隐藏属性 hidden
    public function read13($id = '')
    {
        $user = UserModel::get($id);
        dump($user->hidden(['create_time','update_time'])->toArray());
    }

    // 指定属性 visible
    public function read14($id)
    {
        $user = UserModel::get($id);
        dump($user->visible(['id','nickname'])->toArray());
    }

    // 追加属性 append
    public function read15($id = '')
    {
        $user = UserModel::get($id);
        $result  = $user->append(['user_status'])->toArray();
        dump($result);
    }

    // 读取用户数据输出JSON
    public function read16($id = '')
    {
        $user = UserModel::get($id);
        return $user->toJson();
    }

    // 读取用户数据输出JSON
    public function read17($id = '')
    {
        return json(UserModel::get($id));
    }





}


